<?php
    class Framework{  //创建一个名叫 Framewprk 的类
        public static function run(){ //创建一个 共有的 静态的 方法
            self::initConst(); //调用 类内部 的 static 方法 使用 seif::
            self::initConfig();
            self::initRoutes();
            self::initAutoLoad();
            self::initDispatch();
        }
        //定义路径常量
        private static function initConst(){ //创建一个 私有的 静态的 方法
            define('DS',DIRECTORY_SEPARATOR);
            // define() 函数定义一个常量   语法：define(name,value,case_insensitive)
            //   1.name必需。规定常量的名称。//name参数为define函数的第一个参数，且为大写；
            //   2.value必需。规定常量的值。//value的值一般为字符串或者数字
            //   3.case_insensitive 可选。规定常量的名称是否对大小写敏感  true:不敏感。
            // DIRECTORY_SEPARATOR : 用于处理路径分隔符问题
            //   定义 DS 路径分隔符
            define('ROOT_PATH',getcwd().DS);
            // getcwd() 获取当前工作目录  D:\wamp64\www\新闻管理系统\framework\Framework.class.php
            define('APP_PATH',ROOT_PATH.'Application'.DS);
            define('FRAMEWORK_PATH',ROOT_PATH.'Framework'.DS);

            define('CONFIG_PATH',APP_PATH.'config'.DS);

            define('CONTROLLER_PATH',APP_PATH.'controller'.DS);
            define('MODEL_PATH',APP_PATH.'model'.DS);
            define('VIEW_PATH',APP_PATH.'view'.DS);
        }
        //此处以 home 做解释
        //导入配置文件
        private static function initConfig(){
            $GLOBALS['config']=require CONFIG_PATH.'config.php';
            // $GLOBALS — 引用全局作用域中可用的全部变量
            //   $GLOBALS['var']是外部的全局变量本身，而global $var是外部$var的同名引用或者指针
        }
        //定义路由
        private static function initRoutes(){
            define('PLATFORM',isset($_REQUEST['p'])?$_REQUEST['p']:$GLOBALS['config']['app']['default_platform']);
            // isset函数是检测变量是否设置  三元运算符
            // $_REQUEST 用于收集HTML表单提交的数据
            // 定义 常量 PLATFORM 值为： $GLOBALS['config']['app']['default_platform'] = 'home'
            define('CONTROLLER',isset($_REQUEST['c'])?$_REQUEST['c']:$GLOBALS['config'][PLATFORM]['default_controller']);
            define('ACTION',isset($_REQUEST['a'])?$_REQUEST['a']:$GLOBALS['config'][PLATFORM]['default_action']);

            define('CURRENT_CONTROLLER_PATH',CONTROLLER_PATH.PLATFORM.DS);
            // CURRENT_CONTROLLER_PATH 翻译：当前控制器路径 controller\home
            define('CURRENT_MODEL_PATH',MODEL_PATH.PLATFORM.DS);
            define('CURRENT_VIEW_PATH',VIEW_PATH.PLATFORM.DS);
        }
        //自动加载类
        private static function autoload($class_name){
            $class_map=array(
                'MySqlPDO'=>FRAMEWORK_PATH.'MySqlPDO.class.php',
                'Model'=>FRAMEWORK_PATH.'Model.class.php',
                'Controller'=>FRAMEWORK_PATH.'Controller.class.php' //可写可不写
            );
            if(isset($class_map[$class_name])){
                require $class_map[$class_name];
            }else if(substr($class_name,-5) == 'Model'){
                // substr() 函数返回字符串的一部分 语法：substr(string,start,length)
                //   string	必需  规定要返回其中一部分的字符串。
                //   start 必需  规定在字符串的何处开始。
                require CURRENT_MODEL_PATH.$class_name.'.class.php';
            }else if(substr($class_name,-10) == 'Controller'){
                require CURRENT_CONTROLLER_PATH.$class_name.'.class.php';
            }else{
                die('未能找到类：'.$class_name);
            }
        }
        private static function initAutoLoad(){
            spl_autoload_register('Framework::autoload');
            // spl_autoload_register 是一个实现自动加载类的函数
            //   参数 autoload_function ：欲注册的自动装载函数
        }
        //请求分发
        private static function initDispatch(){
            $controller_name = CONTROLLER.'Controller';
            // $controller_name = newsController
            $action_name = ACTION.'Action';
            // $action_name = listAction
            $controller = new $controller_name();
            // 实例化 newsController
            $controller -> $action_name();
            //调用 newsController 中的 listAction
        }
	}